#include <stdlib.h>

#ifndef __DLIST_H_
#define __DLIST_H_

typedef int (*cmp_t)(const void *data, const void *key);

typedef void (*pri_t)(const void *data);

typedef struct node_st {
	struct node_st *next;
	struct node_st *prev;
	char data[0];
} node_t;

typedef struct listhead_st {
	struct node_st node;
	int size;
} dlist_t;

int listhead_init(dlist_t **li, int size);

int list_empty(const dlist_t *li);

int list_insert_head(dlist_t *li, const void *data);

int list_insert_tail(dlist_t *li, const void *data);

void *list_find(const dlist_t *li, const void *key, cmp_t cmp);

int list_delete(dlist_t *li, const void *key, cmp_t cmp);

int list_fetch(dlist_t *li, const void *key, cmp_t cmp, void *data);

void list_travel(const dlist_t *li, pri_t pri);

void list_destroy(dlist_t **li);

// Extra

void *list_middle(dlist_t *li);

void list_reverse(dlist_t *li);

#endif
